100 SYS 700:.OPT OO:*=$C000 105 ; ************************* 110 ; * * 115 ; * ML SOUND GENERATOR * 120 ; * HAPPY SOUNDING BACH * 125 ; * ROBERT ALONSO * 130 ; * * 135 ; ************************* 140 ; 145 ; EQUATES 150 ; 155 SIGVOL = $D418 160 ATDCY1 = $D405 165 SUREL1 = $D406 170 VCREG1 = $D404 175 FRELO1 = $D400 180 FREHI1 = $D401 185 ; 190 ; INITIALIZATION 195 ; 200 LDA #$0F ;SET THE VOLUME TO 15. 205 STA SIGVOL ;LIKE POKE 54296,15. 210 ; 215 LDA #$09 ;SET ATTACK/DECAY TO 9. 220 STA ATDCY1 ;LIKE POKE 54277,9. 225 ; 230 LDA #$11 ;SUSTAIN/RELEASE TO 17. 235 STA SUREL1 ;LIKE POKE 54278,17. 240 ; 245 LDA #$11 ;SELECT TRIANGLE WAVE. 250 STA VCREG1 ;LIKE POKE 54276,17. 255 ; 260 LDX #$00 ;ZERO OUT THE OFFSET. 265 ; 270 ; MAIN LOOP, GETS AND PLAYS NOTES. 275 ; 280 LOOP = * 285 LDA NOTES,X ;GET THE HI VALUE AND 290 STA FREHI1 ;STORE IT IN REGISTER. 295 INX ;INCREASE OFFSET. 300 ; 305 LDA NOTES,X ;GET LO VALUE AND STORE 310 STA FRELO1 ;IT IN REGISTER. 315 INX ;INCREASE OFFSET AGAIN. 320 ; 325 LDA NOTES,X ;GET THE DURATION VALUE 330 STA ASAVE ;AND STORE IT IN ASAVE. 335 INX ;INCREASE THE OFFSET. 340 ; 345 STX XSAVE ;SAVE THE OFFSET VALUE 350 JSR DELAY ;AND (null) TO THE DELAY. 355 ; 360 LDA #$11 ;RESET TRIANGLE WAVE. 365 STA VCREG1 ;DELAY TURNS IT OFF. 370 ; 375 LDX XSAVE ;GET THE OFFSET VALUE. 380 CPX #$60 ;"IS IT 96? 385 BNE LOOP ;NO, [167] LOOP AGAIN. 390 JMP [128] ;YES, [167] [203] [164] [128]. 395 ; 400 ; DELAY LOOP USED [129] DURATI[145]. 405 ; 410 DELAY [178] [172] 415 LDY #$00 ;ZERO THE .Y OFFSET 420 ; 425 SET LDX #$00;[175] THE .X OFFSET. 430 PLAY INX ;INCREASE THE .X 435 CPX #$FF ;"DOES .X=255? 440 BNE PLAY ;NO, THEN (null) TO PLAY. 445 ; 450 INY ;YES, INCREASE .Y 455 CPY #$4B ;"DOES .Y=75? 460 BNE SET ;NO, [167] [203] [164] SET. 465 ; 470 DEC A[148] ;YES,DECREASE DURATI[145]. 475 LDA A[148] ;[161] DURATI[145] [197]UE. 480 BNE DELAY ;[139] [179][177]0 [167] DELAY. 485 ; 490 LDA #$10 ;SI[195]CE SOUND BY SET[171] 495 STA VCREG1 ;TING BIT 0 OFF. 500 RTS ;[142] [164] CALLER. 505 ; 510 [128] LDA #$00;ZERO ALL REGISTERS. 515 STA VCREG1 ;[151] 54276,0 520 STA ATDCY1 ;[151] 54277,0 525 STA SUREL1 ;[151] 54278,0 530 STA [184]LO1 ;[151] 54272,0 535 STA [184]HI1 ;[151] 54273,0 540 STA SIGVOL ;[151] 54296,0 545 RTS ;[142] [164] CALLER. 550 ; 555 ; TEMP[176]ARY S[164]RAGE 560 ; 565 X[148] .BYTE $00 570 A[148] .BYTE $00 575 ; 580 ; HI, LO [175] RELATIVE DURATI[145] 585 ; 590 [168]ES [178] [172] 595 .BYTE $33,$61,$02 600 .BYTE $22,$4B,$01 605 .BYTE $26,$7E,$01 610 .BYTE $2B,$34,$01 615 .BYTE $2D,$C6,$01 620 .BYTE $33,$61,$02 625 .BYTE $22,$4B,$02 630 .BYTE $22,$4B,$02 635 .BYTE $39,$AC,$02 640 .BYTE $2D,$C6,$01 645 .BYTE $33,$61,$01 650 .BYTE $39,$AC,$01 655 .BYTE $40,$BC,$01 660 .BYTE $44,$95,$02 665 .BYTE $22,$4B,$02 670 .BYTE $22,$4B,$02 675 .BYTE $2D,$C6,$02 680 .BYTE $33,$61,$01 685 .BYTE $2D,$C6,$01 690 .BYTE $2B,$34,$01 695 .BYTE $26,$7E,$01 700 .BYTE $2B,$34,$02 705 .BYTE $2D,$C6,$01 710 .BYTE $2B,$34,$01 715 .BYTE $26,$7E,$01 720 .BYTE $22,$4B,$01 725 .BYTE $26,$7E,$02 730 .BYTE $2B,$34,$01 735 .BYTE $26,$7E,$01 740 .BYTE $22,$4B,$01 745 .BYTE $1F,$FF,$01 750 .BYTE $22,$4B,$04